今天預計使用 webpack 將 TodoList 打包
如果要安裝流程可參照昨天Day 13 - Webpack [part1][簡介與 Babel]
那就來開始吧
新增一個 webpack.js 的檔案
touch webpack.js
打開 webpack.js 照著官網上把 entry & output 加上去
在此之前先將之前寫的檔案搬到 src 下面
mkdir src
cp www/index.html src
cp www/main.js src
cp www/TodoController.js src
cp www/TodoItem.js src
設定 webpack
module.exports = {
  entry: [
    './src/main.js' //  將 main.js 指定為入口網站
  ],
  output: {
    path: path.resolve(process.cwd(), 'build') // 將產出放在 build 上
  }
}
使用 loader 將 js 打包起來
module.exports = {
  entry: [
    './src/main.js' //  將 main.js 指定為入口網站
  ],
  output: {
    path: path.resolve(process.cwd(), 'build') // 將產出放在 build 上
  },
  module: {
    rules: [{
      test: /\.js$/,
      loader: 'babel-loader',
      exclude: /node_modules/,
    }],
  }
}
webpack 4 之後使用 module.rules 在之前是使用 module.loaders
感覺已經設定完了!
打開 package.json 加上這個 script
"scripts": {
  "build": "webpack --mode development --config ./webpack.js --progress",
},
試著跑跑看
npm run build
結果出了一堆錯誤,檢查一遍 main.js 原來裡面還有 YUI 的 code ,將它移除之後,使用 import + export keyword 讓模組匯出和匯入
因為之前都還是使用 YUI 今天來正式改為 ES6 的 module 語法
改法很簡單
定義
TodoItem.js
function TodoItem(content, check) {
  this.content = content;
  this.check = Boolean(check);
  this.time = new Date();
};
TodoItem.prototype.getTime = function () {
  return this.time.toDateString();
};
TodoItem.prototype.toggle = function () {
  return this.check = !this.check;
};
export default TodoItem;
引用
TodoController.js
import TodoItem from './TodoItem'
function TodoController({ view, data, bindId }) {
  this.data = data;
詳細請參照完整代碼
改完之後再跑跑看一次,成功打包完成,會發現多了一個 build/main.js 檔案
在 index.html 中加入
<script src="/main.js">
太麻煩了吧!!!!
安裝以下
npm install --save-dev html-loader html-webpack-plugin
在 webpack.js 中新增
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  mode: 'development',
  entry: [
    './src/main.js'
  ],
  output: {
    path: path.resolve(process.cwd(), 'build')
  },
  module: {
    rules: [{
      test: /\.js$/,
      loader: 'babel-loader',
      exclude: /node_modules/,
    }, {
      test: /\.html$/,
      loader: 'html-loader',
    }],
  },
  plugins: [ // 設定自動插入 main.js
    new HtmlWebpackPlugin({
      inject: true,
      template: `./src/index.html`,
    })
  ],
};
再跑跑看
npm run build
成功產出有被插入的 index.html
把檔案丟到瀏覽器看看吧!
--
但這樣開發流程還是有點不便,明天來研究怎麼加速這樣子的開發流程吧!
今日程式碼
明天待續